#include "Thread.h"
#include <stdio.h>

Thread::Thread()
: _thid(0)
, _isRunning(false)
{

}

Thread::~Thread()
{
    if(_isRunning)
    {
        //让子线程与主线程分离，然后主线程不用等待子线程的退出
       int ret =  pthread_detach(_thid);
        if(ret)
        {
            perror("pthread_detach");
            return;
        }
    }
}

void Thread::start()
{
    //第一个难点：threadFunc作为成员函数的时候，要消除this指针影响
    //所以需要设置为静态的成员函数
    int ret = pthread_create(&_thid, nullptr, threadFunc, this);
    if(ret)
    {
        perror("pthread_create");
        return;
    }

    _isRunning = true;
}

void Thread::join()
{
    if(_isRunning)
    {
        int ret = pthread_join(_thid, nullptr);
        if(ret)
        {
            perror("pthread_join");
            return;
        }
        
        _isRunning = false;
    }
}

void *Thread::threadFunc(void *args)
{
    Thread *pth = static_cast<Thread *>(args);
    if(pth)
    {
        //线程执行任务
        //第二个难点：threadFunc是静态成员函数，而run是非静态的。
        //所以语法上面是会报错的。为了解决这个问题，有两种方法
        //第一：将run设置为静态的（静态函数不能设置为虚函数）
        //第二，可以再构建一个指针，让该指针调用run方法
        //这个指针可以通过threadFunc的参数args传进来，而args
        //是一个nullptr，所以需要将pthread_create的第四个
        //参数设置为this指针
        pth->run();//体现出多态
    }

    /* return nullptr; */
    pthread_exit(nullptr);
}


